package BioRostro;

import adirector.Record;
import adirector.saSpeedMatch;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.neurotechnology.Library.CCIDL;
import com.neurotechnology.Library.NativeManager;
import com.neurotechnology.NImages.NImage;
import com.neurotechnology.NImages.NImageFormat;
import com.neurotechnology.NMatcher.NMatcher;
import com.neurotechnology.Templates.NBiometricType;
import com.neurotechnology.Templates.NLTemplate;
import java.sql.SQLException;
import pkg1ifxArchivos.caDatosTemplate;
import pkg1ifxArchivos.cifxConfig;
import pkg1ifxArchivos.cifxLogs;

public class RecordDB //Rostro
{

	private Connection con;
	private List<Record> recordsList;
        Record fr;
private final String url = "jdbc:sqlserver://";

    private  String serverName = "----";
    private  String portNumber = "----";
    private  String databaseName = "----";
    private  String userName = "----";
    private  String password = "----";
    private  String selectMethod = "cursor";
    //Strail 11ene2012
    private int ninicio=0;
    private int nfinal =-1;
    //Strail 30ene2012
    //PAra leer el archivo de configuracion
    private static cifxLogs olog = new cifxLogs("appbots.log");
    private static cifxConfig oconf = new cifxConfig("appbots.conf",olog);
    private boolean parametroscargados = false;
    public void cargaParametrosConf()
    {
        /*
         * SERVIDOR_BD=localhost
PUERTO_BD=1433
USUARIO_BD=sa
PASSWORD_BD=4dm1nSA2011
NOMBASEDADOS_BD=caja
         */
        try
        {
            if(!parametroscargados)
            {
                olog.outMensaje("(ROSTRO) RecordDB.cargaParametrosConf(): INICIO CARGA DE PARAMETROS");
                serverName = oconf.traeParametro("SERVIDOR_BD");
                portNumber= (oconf.traeParametro("PUERTO_BD"));
                databaseName = oconf.traeParametro("NOMBASEDADOS_BD");
                password = oconf.traeParametro("PASSWORD_BD");
                userName = oconf.traeParametro("USUARIO_BD");
                parametroscargados=true;
                olog.outMensaje("(ROSTRO) RecordDB.cargaParametrosConf(): FIN CARGA DE PARAMETROS");
            }
        }catch(Exception err)
        {
            olog.outMensaje("(ROSTRO) RecordDB.cargaParametrosConf(): ERROR"+ err.getMessage());
        }
       // serverName =Integer.valueOf(oconf.traeParametro("PUERTO_LOCAL"));
    }
    public void setRango(int minicio, int mfinal)
    {
        ninicio=minicio;
        nfinal=mfinal;
    }

        private String getConnectionUrl()
        {
            //Strail 30ene2012
            cargaParametrosConf();
            //
            return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
        }

        //Strail 11ene2012
        public void actualizarArrayListRostro(caDatosTemplate odatostemplate)
        {
            try
            {
                for(int i=0; i < odatostemplate.getTemplate().length; i++)
                {


                        fr = new Record();
                        fr.setName(odatostemplate.getCedulas()[0]);
                        fr.setId(odatostemplate.getTemplate()[i].Id);
                        fr.setTempalte(odatostemplate.getTemplate()[i].getTemplate());


                }
                recordsList.add(fr);

            }
            catch (Exception ex) {
                     System.out.println("actualizarArrayListHuella(): ERROR : "+ ex.getMessage());

            }
        }
    //Strail 13feb2012
    public RecordDB(int minicio,int mfinal,saSpeedMatch smdato)
    {
        try
        {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(getConnectionUrl(),userName,password);
            olog.outMensaje("(ROSTRO)RecordDB(): CARGANDO BIOMETRIAS ... INICIANDO EN:"+minicio);
            ninicio=minicio;
            nfinal=mfinal;
            ResultSet rs = selectRango(ninicio, nfinal);
            //Strail 11ene2012 ResultSet rs = selectAll();
            int ncuantas=0;
            while (rs.next())
            {

                fr = new Record();
                fr.setId(rs.getInt("Id"));
                fr.setName(rs.getString("TemplateId"));
                fr.setTempalte(rs.getBytes("Template"));
                smdato.agregaRecordTemplate(fr);
                //recordsList.add(fr);
                ncuantas++;
            }
            //olog.outMensaje("(HUELLA)RecordDB(): BIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
            olog.outMensaje("(ROSTRO)RecordDB(): \nBIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
            olog.outMensaje("(ROSTRO)RecordDB(): BIOMETRIAS CARGADAS + INICIO ... TOTAL:"+(ncuantas+minicio));
            olog.outMensaje("(ROSTRO)RecordDB(): BIOMETRIAS ESPERADAS:"+(nfinal));


        }
        catch(SQLException se){

            olog.outMensaje("(HUELLA)RecordDB(): ERROR(0) SQLException : "+se.getMessage());
        }
        catch(Exception e)
        {
            olog.outMensaje("(HUELLA)RecordDB(): ERROR(0) : "+e.getMessage());
        }

    }
        public RecordDB(int minicio,int mfinal) throws Exception
        {
            try{
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                con = DriverManager.getConnection(getConnectionUrl(),userName,password);
            }catch(SQLException e){
                System.out.println("RecordDBServidor, Constructor, driver u usuario o contraseña "+e);
                olog.outMensaje("(ROSTRO)RecordDB(): ERROR "+e.getMessage());
            }
            olog.outMensaje("(ROSTRO)RecordDB(): CARGANDO BIOMETRIAS ... INICIANDO EN:"+minicio);
            recordsList = new ArrayList<Record>();

            ninicio=minicio;
            nfinal=mfinal;
            ResultSet rs = selectRango(ninicio, nfinal);
            //Strail 11ene2012 ResultSet rs = selectAll();
            int ncuantas=0;
            while (rs.next()) {
                fr = new Record();
                fr.setId(rs.getInt("Id"));
                fr.setName(rs.getString("TemplateId"));
                fr.setTempalte(rs.getBytes("Template"));
                recordsList.add(fr);
                ncuantas++;
            }

            olog.outMensaje("(ROSTRO)RecordDB(): \nBIOMETRIAS CARGADAS ... HASTA:"+ncuantas);
            olog.outMensaje("(ROSTRO)RecordDB(): BIOMETRIAS CARGADAS + INICIO ... TOTAL:"+(ncuantas+minicio));
            olog.outMensaje("(ROSTRO)RecordDB(): BIOMETRIAS ESPERADAS:"+(nfinal));
	}

	public List<Record> getRecords(){
		return recordsList;
	}
	    /***
     * Funcion que retorna un ResulSet con un rango de templates
     * @param ninicio Numero de inicio del ID de los template
     * @param nfinal Numero FInal de los ID, donde -1 indica sin limite final
     * @return
     */
    public ResultSet selectRango(int ninicio, int nfinal)
    {
        ResultSet rs = null;
        try
        {
            Statement select = con.createStatement();
            String cadenaselect="";
            if(nfinal==-1)
            {
                cadenaselect = "SELECT * FROM Face_Templates WHERE Id >= "+ninicio;
            }
            else
            {
                cadenaselect = "SELECT * FROM Face_Templates WHERE Id >= "+ninicio+" AND Id <="+nfinal;
            }
            rs = select.executeQuery(cadenaselect);
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            olog.outMensaje("(ROSTRO)selectRango(): ERROR"+e.getMessage());
        }
        return rs;
    }

    public String selectTemplate(byte[] template,String cedula, NMatcher matcher)
    {
        ResultSet rs = null;
        String resultados =null;
        try
        {
            Statement select = con.createStatement();
            String cadenaselect="";
            //cadenaselect = "SELECT * FROM Finger_Templates WHERE TemplateId='"+cedula+"'";
            cadenaselect = "SELECT * FROM Face_Templates WHERE SUBSTRING(TemplateId,1,10)="+cedula+"";

            rs = select.executeQuery(cadenaselect);
            while(rs.next())
            {
                int score = matcher.verify(rs.getBytes("Template"), template);
                if(score !=0)
                    resultados="1|"+cedula;
            }

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            olog.outMensaje("(ROSTRO)selectTemplate(): ERROR"+e.getMessage());
        }
        return resultados;
    }

    public ResultSet selectAll() {
		ResultSet rs = null;
		try {
			Statement select = con.createStatement();
			rs = select.executeQuery("SELECT * FROM Face_Templates");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return rs;
	}

        public void grabarRostro(String maxID){
            try{
                PreparedStatement pstmt = con.prepareStatement("SELECT * FROM Face_Templates where Id = "+maxID);
                ResultSet rs = pstmt.executeQuery();
                rs.next();
                fr = new Record();
                fr.setId(rs.getInt("Id")); 
                fr.setName(rs.getString("TemplateId"));
                fr.setTempalte(rs.getBytes("Template"));
                recordsList.add(fr);
                System.out.println("adiciono el template: "+maxID);
            }catch(SQLException ex){
                System.out.println("error insertando Fenix_Server huella "+ex);
            }
        }
        
        public byte[] IdentRostro(String maxID){
            byte[] temp = null;
            try{
                PreparedStatement pstmt = con.prepareStatement("SELECT * FROM Face_temporal where Id = "+maxID);
                ResultSet rs = pstmt.executeQuery();
                rs.next();
                temp = rs.getBytes("Template");
                System.out.println("leyo el template: "+maxID);
                return temp;
            }catch(SQLException ex){
                System.out.println("error insertando Fenix_Server huella "+ex);
                return temp;
            }
        }
        
	public synchronized void append(String name, NImage image, NLTemplate template) throws Exception {

		PreparedStatement pstmt = con.prepareStatement("Select MAX(Id) from Face_Templates");
		int maxID = pstmt.executeQuery().getInt(1);
		
		byte[] pngimage = null;
		for (NImageFormat format : NImageFormat.getFormats()) 
			if (format.getName().contains("PNG"))
				pngimage = format.saveToMemory(image);
		
		pstmt = con.prepareStatement("INSERT INTO Templates VALUES (?,?,?,?)");
		pstmt.setInt(1, maxID + 1);
		if (name != null)
			pstmt.setString(2, name);
		if (template != null)
			pstmt.setBytes(3, template.toByteArray());
		if (pngimage != null)
			pstmt.setBytes(4, null);
		pstmt.execute();
		fr = new Record();
		fr.setId(maxID + 1);
		fr.setName(name);
		fr.setTempalte(template.toByteArray());
		recordsList.add(fr);
	}

	public synchronized void deleteDB() {
		try {
			Statement delete = con.createStatement();
			delete.executeQuery("DELETE FROM Templates");
			recordsList = new ArrayList<Record>();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}
